\subsection{Préemption des \textit{threads}}

\paragraph{Présentation}
La préemption permet d'exécuter un peu chaque \textit{thread}. Cela évite donc de rester bloqué sur les \textit{threads} qui mettent longtemps à s'exécuter. Deux façon étaient possibles pour réaliser la préemption : la première aurait été de préempter le \textit{thread} quand il fait un appel à une des fonctions de la bibliothèque. Mais dans ce cas un \textit{thread} qui ne fait pas d'appel aux fonctions de la bibliothèque pourrait toujours garder la main pendant un long temps. Nous avons donc préféré utiliser une autre méthode qui repose sur l'utilisation de signaux.

\paragraph{Implémentation}
L'idée générale utilisée pour implémenter la préemption a été d'utiliser une alarme. Lorsque cette alarme se déclenche elle envoie un signal particulier \textsf{SIGVALARM}. Celui-ci nous permet à travers un gestionnaire de signaux de préempter le \textit{thread} qui s'exécute. Le gestionnaire de signaux appelle simplement la fonction \texttt{thread\_yield()} autorisant l'exécution des autres \textit{threads}. Pour ne pas laisser nos listes dans un état incohérent lors de leur modification, l'alarme est désactivée au début de chaque fonction gérant les \textit{threads} et relancée à la fin. La durée du \textit{time slice} est donc définie par la durée avant que l'alarme se déclenche. L'alarme est en mode \texttt{ITIMER\_{}VIRTUAL} ce qui fait qu'elle décroit uniquement quand le processus s'exécute.

\paragraph{Tests}
Nous avons rajouté un test \texttt{61-preemption.c} pour vérifier le fonctionnement de la préemption. Le \textit{main} commence par créer deux \textit{threads}. Ensuite chaque \textit{thread} et le \textit{main} vont faire des tours de boucle et afficher un message après un certain nombre de tours de boucle. Alors qu'aucun appel à \texttt{thread\_{}yield()} n'est fait, les messages s'affichent en alternance.
